#ifndef POCO_H
#define POCO_H

#include "stable.h"

class Pais
{
public:
    Pais( const QString& nombre ) : _nombre( nombre ) {}
    QString nombre() const { return _nombre; }
private:
    QString _nombre;
};

class Ubicacion
{
public:
    Ubicacion( const QString& nombre, Pais* pais, qreal latitude, qreal longitude )
    : _nombre( nombre ), _pais( pais ), _latitude( latitude ), _longitude( longitude ) {}
    QString nombre() const { return _nombre; }
    Pais* pais() const { return _pais; }
    qreal latitude() const { return _latitude; }
    qreal longitude() const { return _longitude; }
private:
    QString _nombre;
    Pais* _pais;
    qreal _latitude;
    qreal _longitude;
};

class Sitio
{
public:
    Sitio( const QString& nombre, Ubicacion* ubicacion ) : _nombre( nombre ), _ubicacion( ubicacion ) {}
    QString nombre() const { return _nombre; }
    Ubicacion* ubicacion() const { return _ubicacion; }
private:
    QString _nombre;
    Ubicacion* _ubicacion;
};

class Muestra
{
public:
    enum Marcador {
        NoMarcador = 0,
        AvisoAscenso = 1,               // "Aviso de ascenso"
        AvisoRgbm = 2,                  // "Aviso de rgbm"
        ErrorTechoPso = 3,              // "Error de techo de parada de seg. obligatoria"
        ParadaSeguridadObligatoria = 4, // "Parada de seguridad obligatoria"
        Superficie = 5,                 // "Superficie"
        Personal = 99,                  // Personal: Texto en marcadores de inmersion
        Otro = 100                      // Otro tipo de muestras
    };
    Muestra()
    : _tiempo(0),
      _profundidad(0),
      _presion(0),
      _temperatura(0),
      _marcador( Muestra::NoMarcador ),
      _tasacas(0),
      _presioncilindro(0)
    {}
    Muestra( quint32 tiempo,
             qreal profundidad,
             quint32 presion,
             quint32 temperatura,
             Marcador marcador,
             qreal tasacas,
             quint32 presioncilindro )
    : _tiempo( tiempo ),
      _profundidad( profundidad ),
      _presion( presion ),
      _temperatura( temperatura ),
      _marcador( marcador ),
      _tasacas( tasacas ),
      _presioncilindro( presioncilindro )
    {}
    void setTiempo( quint32 tiempo ) { _tiempo = tiempo; }
    void setProfundidad( qreal profundidad ) { _profundidad = profundidad; }
    void setPresion( quint32 presion ) { _presion = presion; }
    void setTemperatura( quint32 temperatura ) { _temperatura = temperatura; }
    void setMarcador( Marcador marcador ) { _marcador = marcador; }
    void setTasacas( qreal tasacas ) { _tasacas = tasacas; }
    void setPresioncilindro( quint32 presioncilindro ) { _presioncilindro = presioncilindro; }
    quint32 tiempo() const { return _tiempo; }
    qreal profundidad() const { return _profundidad; }
    quint32 presion() const { return _presion; }
    quint32 temperatura() const { return _temperatura; }
    Marcador marcador() const { return _marcador; }
    qreal tasacas() const { return _tasacas; }
    quint32 presioncilindro() const { return _presioncilindro; }
private:
    quint32 _tiempo;
    qreal _profundidad;
    quint32 _presion;
    quint32 _temperatura;
    Marcador _marcador;
    qreal _tasacas; // Tasa de Consumo de Aire en Superficie (SAC Rate)
    quint32 _presioncilindro;
};

class Viaje
{
public:
    Viaje( const QString& destino ) : _destino( destino ) {}
    QString destino() const { return _destino; }
private:
    QString _destino;
};

class Buceador
{
public:
    Buceador( const QString& usuario, const QString& mapurl ) : _usuario( usuario ), _mapurl( mapurl ) {}
    QString usuario() const { return _usuario; }
    QString mapUrl() const { return _mapurl; }
    QList<Inmersion*> inmersiones() const { return _inmersiones; }
    void addInmersion( Inmersion* inmersion ) { _inmersiones.append( inmersion ); }
    void removeInmersion( Inmersion* inmersion ) {
        for( int i = 0; i < _inmersiones.count(); ++i )
        {
            if( _inmersiones.at(i)->inicio() == inmersion->inicio() )
            {
                _inmersiones.removeAt(i);
                break;
            }
        }
        renumberInmersiones();
    }
    void renumberInmersiones() { for( int i = 0; i < _inmersiones.count(); ++i ) _inmersiones.at(i)->setNumero(i+1); }
    Estadisticas* estadisticas() { return &_estadisticas; }
private:
    QString _usuario;
    QString _mapurl;
    QList<Inmersion*> _inmersiones;
    Estadisticas _estadisticas;
};

class Buddy
{
public:
    Buddy( const QString& nombre, Buceador* buceador ) : _nombre( nombre ), _buceador( buceador ) {}
    QString nombre() const { return _nombre; }
    Buceador* buceador() const { _buceador; }
private:
    QString _nombre;
    Buceador* _buceador;
};

#endif // POCO_H
